home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOS3.DMS / AMOS3.adf / Sound_Tracker.AMOS / Sound_Tracker.amosSourceCode
AMOS Source Code  |  1978-10-10  |  9KB  |  307 lines

  1. '--------------------------------------------------------------------------
  2. '                    SoundTracker Module converter   
  3. '                         By Fran�ois Lionet   
  4. '
  5. ' Converts SoundTracker (1.0 to 2.4) modules to AMOS Music bank  
  6. '--------------------------------------------------------------------------
  7. ' This music converter has been successfully tested with   
  8. ' 1.0, 2.1, 2.3, 2.4 modules. If you find a version that does not
  9. ' work, please send it to Mandarin and we'll adapt it to work. We'll 
  10. ' release any new versions onto the public domain as soon as they are    
  11. ' complete. The AMOS Club is the best place to keep up-to-date with such 
  12. ' developments.
  13. '    SoundTracker modules do not have an identification number describing    
  14. ' which version they are. There is absolutely NO WAY for us to detect    
  15. ' if the versions match. Therefore, you should be sure about the 
  16. ' version you type in, as it WILL crash the Amiga!!! 
  17. '--------------------------------------------------------------------------
  18. ' Version 1.1 of AMOS music player does not support:     
  19. '
  20. ' Arpeggiato. This converter simply skips it. It also skips the
  21. ' "position jump" soundtracker instruction. If you hear a bell sound during
  22. ' conversion, the converter has just skipped past one of these labels. 
  23. '
  24. ' Version 1.2 will support this and much more (like synthetic instruments for    
  25. ' example...) C'est promis jur�! Regards from the army! Francois!  
  26. '--------------------------------------------------------------------------
  27. ' Opens a very small screen to save memory 
  28. Screen Open 0,640,48,2,Hires : Colour 1,$FFF
  29. '
  30. Global TST,AMAX,ABASE
  31. '
  32. IMAX=14 : Dim APAT(5)
  33. SONGDATA=4
  34. I$="Not named       "
  35. I_END=$8000
  36. I_SLUP=$8100
  37. I_SLDOWN=$8200
  38. I_SVOL=$8300
  39. I_REP=$8500
  40. I_LEDM=$8600
  41. I_LEDA=$8700
  42. I_TEMPO=$8800
  43. I_INST=$8900
  44. '
  45. AGAIN:
  46. ST$=Fsel$("","","Please enter module to convert")
  47. If ST$="" Then Default : End 
  48. Open In 1,ST$ : BMAX=Lof(1) : Close 
  49. Erase 10 : Reserve As Work 10,BMAX
  50. Bload ST$,Start(10)
  51. '---> What version of Soundtracker?
  52. Repeat 
  53.    Input "Please input the soundtracker version number (x.x) : ";V$
  54.    V$=Left$(V$,1)
  55. Until(V$="1") or(V$="2")
  56. If V$="1"
  57.    OF_MUSIC=600
  58.    OF_PATTERN=472
  59.    OF_NUMBER=470
  60. Else 
  61.    OF_MUSIC=$438
  62.    OF_PATTERN=$3B8
  63.    OF_NUMBER=$3B6
  64. End If 
  65. '---> Gets size of instruments and song
  66. TST=-1 : Gosub I_CONV
  67. TST=-1 : Gosub S_CONV
  68. '---> Converts patterns
  69. LWORK=(((BMAX-LINST-LSONG)*2)/3+1) and $FFFFFFFE
  70. N=0
  71. Repeat 
  72.    If N=0
  73.       Print "Converting song..."
  74.    Else 
  75.       Print : Print "One more try: my buffer estimation was too small!"
  76.    End If 
  77.    Gosub P_CONV : Print 
  78.    LWORK=LWORK+4000
  79.    Inc N
  80. Until LPATTERN
  81. '---> Converts song
  82. Print : Print "Converting song..."
  83. TST=0 : Gosub S_CONV
  84. '---> Converts instruments 
  85. Print : Print "Converting instruments..."
  86. TST=0 : Gosub I_CONV
  87. ' Creates header 
  88. AD=Start(10) : A$="AmBk" : Gosub 10100 : Doke AD,3 : Doke AD+2,0 : AD=AD+4
  89. TL=8+16+LINST+LSONG+LPATTERN : Loke AD,$80000000 or TL : AD=AD+4
  90. A$="Music   " : Gosub 10100
  91. Loke AD,16 : Loke AD+4,16+LINST : Loke AD+8,16+LINST+LSONG : Loke AD+12,0 : AD=AD+16
  92. ' Copy instrument
  93. SAMCOPY[SCOPY,ECOPY,AD+NI*32+2+4]
  94. Copy Start(11),Start(11)+NI*32+2 To AD
  95. Loke AD+2+NI*32,0
  96. ' Copy Song
  97. Copy Start(12),Start(12)+LSONG To AD+LINST
  98. ' Copy Patterns
  99. Copy Start(13),Start(13)+LPATTERN To AD+LINST+LSONG
  100. '
  101. Clw : ABK$=Fsel$("*.abk","","Save as Amos Music Bank .abk") : If ABK$="" Then Goto AGAIN
  102. Print : Print "Saving AMOS music bank..."
  103. Bsave ABK$,Start(10) To AD+LINST+LSONG+LPATTERN
  104. ' Play the music!
  105. Clw : Centre "Loading the new bank to play it!"
  106. For N=10 To 13
  107.    Erase N
  108. Next 
  109. Load ABK$ : Volume 63 : Music 1
  110. Clw : Centre "Press a key to end..."
  111. Wait Key 
  112. For V=63 To 0 Step -1
  113.    Volume V
  114.    Wait Vbl 
  115. Next 
  116. Erase 3
  117. Clw 
  118. ' And now, happy structured people, a nice GOTO! Arghhh, kill him! 
  119. Goto AGAIN
  120. '----------------------------------------------------------------------------  
  121. ' Instrument conversion
  122. '----------------------------------------------------------------------------
  123. I_CONV:
  124. AD=Start(10)
  125. NPAT=0
  126. For A=AD+OF_PATTERN To AD+OF_PATTERN+127
  127.    NPAT=Max(NPAT,Peek(A))
  128. Next A
  129. Inc NPAT : LMAX=NPAT*1024
  130. ADI=AD+LMAX+OF_MUSIC
  131. NI=1
  132. For A=AD+20 To AD+20+$1E*15 Step $1E
  133.    If Deek(A+22) Then Inc NI
  134. Next 
  135. Erase 11 : Reserve As Work 11,NI*32+2+4 : APOK=Start(11)
  136. AOFF=APOK : SDOKE[AOFF,NI] : AOFF=AOFF+2 : AINST=AOFF+NI*32
  137. INUL=AINST : SLOKE[AINST,0] : AINST=AINST+4 : SCOPY=ADI
  138. A=AD+20
  139. For N=1 To NI
  140.    SLOKE[AOFF,AINST-APOK] : L=Deek(A+22) : SDOKE[AOFF+8,L]
  141.    I2=Deek(A+26) : L2=Deek(A+28)
  142.    If L2=1
  143.       SLOKE[AOFF+4,INUL-APOK] : SDOKE[AOFF+10,2]
  144.    Else 
  145.       SLOKE[AOFF+4,AINST-APOK+I2] : SDOKE[AOFF+10,L2]
  146.    End If 
  147.    SDOKE[AOFF+12,Deek(A+24)]
  148.    L=L*2 : ECOPY=ADI+L
  149.    ADI=ADI+L : AINST=AINST+L
  150.    For P=0 To 15 : SPOKE[AOFF+16+P,Peek(A+P)] : Next 
  151.    Add AOFF,32 : Add A,$1E
  152. Next 
  153. If Btst(0,AINST) Then Inc AINST
  154. LINST=AINST-APOK
  155. Return 
  156. '----------------------------------------------------------------------------  
  157. ' Song conversion
  158. '----------------------------------------------------------------------------
  159. S_CONV:
  160. APOK=0
  161. If TST=0
  162.    Erase 12 : Reserve As Work 12,LSONG : APOK=Start(12)
  163.    Input "Please enter TEMPO value (1-100, default is 17):";T
  164. End If 
  165. AD=Start(10) : AMU=APOK
  166. SDOKE[AMU,1] : Add AMU,2
  167. SLOKE[AMU,6] : Add AMU,4
  168. If T<=0 or T>100 Then T=17
  169. SDOKE[AMU+8,T]
  170. LLIST=Peek(AD+OF_NUMBER)
  171. LPAT=(LLIST+1)*2 : APAT=8+SONGDATA+16
  172. For N=0 To 3 : APAT(N)=AMU+APAT : SDOKE[AMU+N*2,APAT] : APAT=APAT+LPAT : Next N
  173. AMU=AMU+8+SONGDATA
  174. For A=0 To 15 : SPOKE[AMU+A,Peek(AD+A)] : Next : Add AMU,16
  175. AMU=AMU+LPAT*4
  176. For A=AD+OF_PATTERN To AD+OF_PATTERN+LLIST-1
  177.    P=Peek(A)
  178.    For V=0 To 3
  179.       SDOKE[APAT(V),P] : APAT(V)=APAT(V)+2
  180.    Next V
  181. Next A
  182. For V=0 To 3
  183.    SDOKE[APAT(V),-2]
  184. Next V
  185. If Btst(0,AMU) Then Inc AMU
  186. LSONG=AMU-APOK
  187. Return 
  188. '----------------------------------------------------------------------------
  189. ' Pattern conversion 
  190. '----------------------------------------------------------------------------
  191. P_CONV:
  192. Erase 13 : Reserve As Work 13,LWORK : AMAX=Start(13)+LWORK-512 : Fill Start(13) To Start(13)+Length(13),0
  193. AD=Start(10) : AOFF=Start(13)
  194. Print "Number of different patterns:";NPAT
  195. APAT=AOFF+2+NPAT*8
  196. Doke AOFF,NPAT
  197. For NP=0 To NPAT-1 : PATMAX=64 : NBESS=0 : AAPAT=APAT
  198.    O_AGAIN:
  199.    For V=0 To 3 : Locate 0,Y Curs : Print "Computing pattern";NP;" - voice";V;
  200.       AP=AD+OF_MUSIC+NP*1024
  201.       Doke AOFF+2+NP*8+V*2,APAT-AOFF
  202.       Gosub PP_CONV : If APAT>AMAX Then LPATTERN=0 : Return 
  203.    Next V
  204.    If PATMAX<>64 and NBESS=0 Then NBESS=1 : APAT=AAPAT : Print : Goto O_AGAIN
  205. Next NP
  206. LPATTERN=APAT-Start(13)
  207. Return 
  208. '
  209. PP_CONV:
  210. 3100 OI=-1 : VIT=1 : NN=0 : DEL=0 : ADN=0 : VOL=-1
  211. 3200 Inc NN : If NN>PATMAX Then 3250
  212. 3205 D1=Deek(AP+V*4) : D2=Deek(AP+V*4+2) : AP=AP+16
  213. 3210 I=(D2/$1000)+(D1/$1000)*16-1 : If I<0 Then If DEL+VIT<256 Then FLAG=1 : Gosub 3300 : DEL=DEL+VIT : Goto 3200 Else Stop 
  214. 3215 Gosub 3400 : DEL=DEL+VIT
  215. 3220 If OI<>I Then Doke APAT,I_SVOL+63 : Add APAT,2 : VOL=63 : OI=I : Doke APAT,I_INST+I : Add APAT,2
  216. 3225 FLAG=0 : Gosub 3300
  217. 3230 Doke APAT,$7F00 : Doke APAT+2,D1 and $FFF : ADN=APAT : Add APAT,4
  218. 3235 Goto 3200
  219. '
  220. 3250 Gosub 3400
  221. 3255 Doke APAT,I_END : Add APAT,2 : Return 
  222. '
  223. 3300 EFFECT=(D2 and $F00)/$100 : PRAM=D2 and $FF
  224. 3305 Goto 4000+EFFECT*50
  225. '
  226. 3400 If DEL=0 Then Return 
  227. 3405 If ADN=0 and DEL<>0 Then Doke APAT,$7F00+DEL : Doke APAT+2,0 : Add APAT,4
  228. 3410 If ADN<>0 Then Poke ADN+1,DEL
  229. 3415 ADN=0 : DEL=0 : Return 
  230. ' 0 No effect
  231. 4000 Return 
  232. ' 1 Portamento UP  
  233. 4050 If FLAG Then Gosub 3400
  234. 4055 Doke APAT,I_SLUP+PRAM : Add APAT,2 : Return 
  235. ' 2 Portamento DOWN
  236. 4100 If FLAG Then Gosub 3400
  237. 4105 Doke APAT,I_SLDOWN+PRAM : Add APAT,2 : Return 
  238. ' 3
  239. 4150 Return 
  240. ' 4
  241. 4200 Return 
  242. ' 5
  243. 4250 Return 
  244. ' 6
  245. 4300 Return 
  246. ' 7
  247. 4350 Return 
  248. ' 8  
  249. 4400 Return 
  250. ' 9
  251. 4450 Return 
  252. ' A Volume slide 
  253. 4500 Bell : Return 
  254. ' B Position jump
  255. 4550 Bell : Return 
  256. ' C Set volume 
  257. 4600 If FLAG Then Gosub 3400
  258. 4605 If VOL<>PRAM Then If OI>=0 Then Doke APAT,I_SVOL+PRAM : VOL=PRAM : Add APAT,2
  259. 4610 Return 
  260. ' D Pattern break
  261. 4650 PATMAX=NN : Return 
  262. ' E Led on / off 
  263. 4700 If Btst(1,PRAM) Then Doke APAT,I_LEDM Else Doke APAT,I_LEDA
  264. 4705 Add APAT,2 : Return 
  265. ' F Set tempo
  266. 4750 Doke APAT,I_TEMPO+(100/PRAM)
  267. 4755 Add APAT,2 : Return 
  268. '
  269. 10000 For X=0 To Len(A$)-1
  270.    10005 SPOKE[A+X,Asc(Mid$(A$,X+1,1))]
  271. 10010 Next 
  272. 10015 Return 
  273. 10100 A=AD : Gosub 10000 : AD=AD+Len(A$) : Return 
  274. '
  275. Procedure SPOKE[A,B]
  276.    If TST=0
  277.       Poke A,B
  278.    End If 
  279. End Proc
  280. '
  281. Procedure SDOKE[A,B]
  282.    If TST=0
  283.       Doke A,B
  284.    End If 
  285. End Proc
  286. '
  287. Procedure SLOKE[A,B]
  288.    If TST=0
  289.       Loke A,B
  290.    End If 
  291. End Proc
  292. '
  293. Procedure SAMCOPY[S,E,D]
  294.    If TST=0
  295.       If S mod 2=0 and E mod 2=0 and D mod 2=0
  296.          Copy S,E To D
  297.       Else 
  298.          Print "Slow Copying Sample"
  299.          A=0
  300.          While A+S<E
  301.             Poke D+A,Peek(S+A)
  302.             Inc A
  303.          Wend 
  304.          Print "Done."
  305.       End If 
  306.    End If 
  307. End Proc